/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package kernel;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Alexey Chirkov
 */
public class Matrix implements java.io.Serializable {

    static final long serialVersionUID = 2L;
    private double[][] arr;

    /**
     * constructor class Matrix with 2 parametrs
     *
     * @param n count of rows
     * @param m count of columns
     */
    public Matrix(int n, int m) {
        arr = new double[n][m];
    }

    /**
     *
     * @return count row this matrix
     */
    public int getRowCount() {
        return arr.length;
    }

    /**
     *
     * @return count column this matrix
     */
    public int getColumnCount() {
        if (arr.length > 0) {
            return arr[0].length;
        } else {
            return 0;
        }

    }

    /**
     *
     * @param i
     * @param j
     * @param value new value in (i,j) position
     */
    public void setValue(int i, int j, double value) throws Exception {
        if ((i < 0) || (i > arr.length - 1) || (j < 0) || (j > arr[0].length - 1)) {
            throw new Exception("Невозможно выполнить действие: неверно заданы индексы");
        }
        arr[i][j] = value;
    }

    /**
     *
     * @param i
     * @param j
     * @return value in (i,j) position
     */
    public double getValue(int i, int j) throws Exception {
        if ((i < 0) || (i > arr.length - 1) || (j < 0) || (j > arr[0].length - 1)) {
            throw new Exception("Невозможно выполнить действие: неверно заданы индексы");
        }
        return arr[i][j];
    }

    /**
     *
     * @param mat1
     * @param mat2
     * @return sum mat1 and mat2
     */
    public static Matrix execute(Matrix mat1, Matrix mat2) throws Exception {
        if ((mat1.arr.length != mat2.arr.length) || (mat1.arr[0].length != mat2.arr[1].length)) {
            throw new Exception("Невозможно выполнить действие:Размеры матриц не сопадают");
        }
        if ((mat1 == null) || (mat2 == null)) {
            throw new Exception("Невозможно выполнить действие:Матрицы не существуют");
        }
        Matrix res = new Matrix(mat1.arr.length, mat1.arr[0].length);
        for (int i = 0; i < mat1.arr.length; i++) {
            for (int j = 0; j < mat1.arr[0].length; j++) {
                res.arr[i][j] = mat1.arr[i][j] + mat2.arr[i][j];
            }
        }
        return res;
    }

    /**
     *
     * @param mat
     * @param path
     */
    public static void writeMatrix(Matrix mat, String path) throws Exception {


        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new FileWriter(path));
        } catch (IOException ex) {
            throw new Exception("Запись в файл не возможна");
        }
        int n = mat.arr.length;
        int m = mat.arr[0].length;
        pw.write(Integer.toString(n) + " " + Integer.toString(m));
        pw.println();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                pw.write(Double.toString(mat.arr[i][j]) + " ");
            }
            pw.println();
        }
        pw.close();
    }

    /**
     *
     * @param path
     * @return
     */
    public static Matrix readMatrix(String path) throws Exception {
        Matrix res = null;
        BufferedReader br = new BufferedReader(new FileReader(new File(path)));
        String[] arr = br.readLine().split(" ");
        res = new Matrix(new Integer(arr[0]), new Integer(arr[1]));
        for (int i = 0; i < res.arr.length; i++) {
            arr = br.readLine().split(" ");
            System.out.println(arr.length);
            for (int j = 0; j < arr.length; j++) {
                System.out.println(arr[j] + "////////");
            }
            for (int j = 0; j < res.arr[i].length; j++) {
                res.arr[i][j] = new Double(arr[j]).doubleValue();
            }
        }
        return res;
    }

    public static void main(String[] args) {

      
        

    }
}
